package ConCurrent;

import java.util.concurrent.CountDownLatch;

/**
 * 如何在并发情况下保证这三个线程依次执行
 * 继续使用CountDownLatch
 * 可以创建两个CountDownLatch，控制线程B 和 线程C的阻塞等待,已达到A、B、C顺序执行的目的
 *
 *
 */
public class ThreadFiFO {

    public static void main(String[] args) {

        // 创建两个 CountDownLatch，分别用于控制线程 B 和线程 C 的启动
        CountDownLatch latchAB = new CountDownLatch(1);
        CountDownLatch latchBC = new CountDownLatch(1);

        // 创建线程 A
        Thread threadA = new Thread(() -> {
            System.out.println("Thread A starts execution");
            try {
                Thread.sleep(1000); // 模拟线程 A 的执行时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread A finishes execution");
            latchAB.countDown(); // 通知线程 B 开始执行
        }, "ThreadA");

        // 创建线程 B
        Thread threadB = new Thread(() -> {
            try {
                latchAB.await(); // 等待线程 A 完成
                System.out.println("Thread B starts execution");
                try {
                    Thread.sleep(1000); // 模拟线程 B 的执行时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread B finishes execution");
                latchBC.countDown(); // 通知线程 C 开始执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "ThreadB");

        // 创建线程 C
        Thread threadC = new Thread(() -> {
            try {
                latchBC.await(); // 等待线程 B 完成
                System.out.println("Thread C starts execution");
                try {
                    Thread.sleep(1000); // 模拟线程 C 的执行时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread C finishes execution");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "ThreadC");

        // 启动线程
        threadA.start();
        threadB.start();
        threadC.start();
    }

}
